function ocp = acados_ris_ocp_get()
% This function
% Name          :acados_ris_ocp_get
% Descriptions  :设置ocp_opts和ocp_model，得到控制问题的控制对象ocp输入。acados无法求解半定规划，故代码已被废弃
% Return(s)     :ocp
% Author        :LHP,on April 3rd,2024

%% Problem formulation
    % 定义RIS的参数
    N = 0;                                      % 预测步长
    T = 0.0;                                    % 预测总时长[s]

%% Solver parameters 
    compile_interface           = 'auto';                       % 编译接口设置 'auto'
    codgen_model                = 'true';                       % 代码生成模型设置 'true'
    compile_model               = 'true';                       % 代码编译模型设置 'true'
    
    nlp_solver                  = 'sqp_rti';                    % sqp, sqp_rti % 非线性规划求解器设置
    qp_solver                   = 'partial_condensing_hpipm';   % QP求解器设置
    nlp_solver_exact_hessian    = 'false';                      % 是否精确计算海森矩阵 false=gauss_newton, true=exact     
    qp_solver_cond_N            =  5;                           % 用于部分稠密化（partial condensing）情况下的新的优化问题的时间步数 5
    sim_method                  = 'irk';                        % 积分器类型设置：erk, irk, irk_gnsf

%% model dynamics
    [model, constraint] = acados_ris_model();                          % 使用RIS求解问题模型创建模型和约束
    nx = 3;                                       % 状态变量数 3
    nu = 2;                                       % 控制输入变量数 2

%% model to create the solver
    ocp_model = acados_ocp_model();                             % 创建OCP模型对象

%% acados ocp model
    ocp_model.set('name', model.name);                          % model name, used for code generation, default:  ocp_model 
    ocp_model.set('T', T);                                      % end time
                    
    % 设置符号变量
    ocp_model.set('sym_x', model.x);
    ocp_model.set('sym_u', model.u);
    ocp_model.set('sym_p', model.p);
    ocp_model.set('sym_xdot', model.xdot);
    ocp_model.set('sym_z', model.z);

    % 设置运动学方程
    ocp_model.set('dyn_type', 'implicit');
    ocp_model.set('dyn_expr_f', model.f_impl_expr);
    
    % 设置约束
    %ocp_model.set('constr_x0', eye(4));                           % 设置初始条件
    
    % 设置非线性约束（bug:提示维度不对，无法求解半定规划）
    ocp_model.set('constr_type', 'bgh');
    ocp_model.set('constr_expr_h', constraint.expr);
    ocp_model.set('constr_lh', [...
                                    constraint.LMI_min,...                                
                                    constraint.X_min,...  
                                    constraint.mu_min,...
                                ]);
    ocp_model.set('constr_uh', [...
                                    constraint.LMI_max,...                                
                                    constraint.X_max,...  
                                    constraint.mu_max,...
                                ]); 

    % 优化目标函数
    cost_type = 'auto';                                             % auto, ext_cost, linear_ls, nonlinear_ls
    ocp_model.set('cost_type', cost_type);
    ocp_model.set('cost_type_e', cost_type);
    
    ocp_model.set('cost_expr_ext_cost', model.cost_expr_ext_cost);
    ocp_model.set('cost_expr_ext_cost_e', model.cost_expr_ext_cost_e);
    
%% acados ocp set opts
    ocp_opts = acados_ocp_opts();                                       % 创建OCP选项对象
    %ocp_opts.set('compile_interface', compile_interface);
    %ocp_opts.set('codgen_model', codgen_model);
    %ocp_opts.set('compile_model', compile_model);
    ocp_opts.set('param_scheme_N', N);                                  % 描述离散化点的数量，通常用于将连续时间问题转化为离散时间问题
    ocp_opts.set('nlp_solver', nlp_solver);                             % 非线性规划求解器设置
    ocp_opts.set('nlp_solver_exact_hessian', nlp_solver_exact_hessian); % 是否精确计算海森矩阵
    ocp_opts.set('sim_method', sim_method);                             % 积分器类型设置
    ocp_opts.set('sim_method_num_stages', 4);                           % 数值积分方法阶数设置
    ocp_opts.set('sim_method_num_steps', 50);                           % 数值积分方法步数设置
    ocp_opts.set('qp_solver', qp_solver);                               % QP求解器设置
    ocp_opts.set('qp_solver_cond_N', qp_solver_cond_N);                 % 部分稠密化（partial condensing）情况下的新的优化问题的时间步数
    ocp_opts.set('nlp_solver_tol_stat', 1e-6);                          % stopping criterion
    ocp_opts.set('nlp_solver_tol_eq', 1e-6);                            % stopping criterion
    ocp_opts.set('nlp_solver_tol_ineq', 1e-6);                          % stopping criterion
    ocp_opts.set('nlp_solver_tol_comp', 1e-6);                          % stopping criterion
    ocp_opts.set('parameter_values', zeros(nx+1,nx+1));                 % 问题中状态变量的维度
    
%% create ocp solver
% bug:setting external constraint function h: need expr_h, lh, uh at least one missing.
    ocp = acados_ocp(ocp_model, ocp_opts);                              % 创建OCP求解器对象 bug : Building templated code as shared library，只能运行一次

end